﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void selectSortMem(void* ptr, int ele_size, int ele_num, int(*compare)(void*, void*))
{
	char* temp = malloc(ele_size);
	for (int i = 0; i < ele_num; ++i)
	{
		int minOrMax = i;

		for (int j = i + 1; j < ele_num; ++j)
		{
			//1.获得当前元素i的地址；
			char* pMinOrMax = (char*)ptr + minOrMax * ele_size;

			//2.从第二个元素开始的，内循环元素的地址；
			char* pJ = (char*)ptr + j * ele_size;

			if (compare(pJ, pMinOrMax))
			{
				minOrMax = j;
			}
		}

		//6.获取到最小索引minOrMax，然后和i进行交换，实现从小到大排列；
		if (minOrMax != i)
		{
			char* pMinOrMax = (char*)ptr + minOrMax * ele_size;
			char* pI = (char*)ptr + i * ele_size;

			//3.对下标为I和MinOrMax的元素，进行交换；用内存拷贝的方式进行交换；
			memcpy(temp, pI, ele_size);
			memcpy(pI, pMinOrMax, ele_size);
			memcpy(pMinOrMax, temp, ele_size);
		}
	}

	if (temp != NULL)
	{
		free(temp);
		temp = NULL;
	}
}
//4.比较函数；
int compareInt(void* d1, void* d2)
{
	int* p1 = (int*)d1;
	int* p2 = (int*)d2;

	//5.如果第一个数小于第二个数，就返回true;
	return *p1 < *p2;
}
void testSortAlgorithm()
{
	int arr[] = { 7,4,9,2,1 };
	selectSortMem(arr, sizeof(int), sizeof(arr) / sizeof(int), compareInt);
	for (int i = 0; i < 5; ++i)
	{
		printf("7.输出选择排序从小到大排列arr[i]：%d\n", arr[i]);//1，2，4，7，9
	}
#define MAX_DATA 1024
}

//#define FLAG
#ifdef FLAG

void funcDef(long a)
{

}
#else

void funcDef(int a)
{

}
#endif

void doLogicFile(int* p)
{
	if (NULL == p)
	{
		printf("9.编译时预设宏定义：%s的%d行出错！\n", __FILE__, __LINE__);
		printf("10.编译时预设宏定义：日期%s\n", __DATE__);//10.编译时预设宏定义：日期Apr  1 2021
		printf("11.编译时预设宏定义：时间%s\n", __TIME__);//11.编译时预设宏定义：时间19:39:52
		return;
	}
}

//main216：排序算法和预定宏
int main216()
{
	testSortAlgorithm();
	printf("8.输出宏定义常量MAX_DATA：%d\n", MAX_DATA);//1024
	doLogicFile(NULL);//9.编译时预设宏定义：E:\codespace\VSHelloWorld\VSHelloWorld\SortAlgorithm.c的85行出错！

	system("pause");
	return EXIT_SUCCESS;
}